// enum Color {Red, Green, Blue};
// let c: Color = Color.Blue;  //c定义成枚举类型，并赋值
// console.log(c);    // 输出 2

// // enum Color { Red = 1, Green, Blue }
// // let colorName: string = Color[2];  // Color[2]取到的是数值对应的名字，字符串类型
// // alert(colorName);  // 显示'Green'因为上面代码里它的值是2

// enum Gender {
//   Male,
//   Female
// }
// let i: { name: string, gender: Gender };//i是指定对象类型，其中gender属性定义为枚举类型
// i = {
//   name: '孙悟空',
//   gender: Gender.Male // 0
//   //gender: 0  //也可以
// }
// console.log(i.gender === Gender.Male);//true



//枚举类型， 定义一些有名字的数字常量
// 一个枚举类型可以包含零个或多个枚举成员
// 枚举成员具有一个数字值，它可以是常数或是计算得出的值（常数枚举成员/计算枚举成员）

/* 当满足如下条件之一时，枚举成员被当作是常数（常数枚举成员）：
1.不具有初始化函数并且之前的枚举成员是常数：
在这种情况下，当前枚举成员的值为上一个枚举成员的值加1。
如果是第一个枚举成员，则值为0。 
2.枚举成员使用常数枚举表达式初始化。
*/
/*所有其它情况的枚举成员被当作是需要计算得出的值。（即计算枚举成员） */

//示例1：不具有初始化函数并且之前的枚举成员是常数
enum Direction {
  // 都是常数枚举成员
  front, //0
  Up = 1,
  Down, //2
  Left = 2, //2
  Right //3
}
console.log(Direction);
console.log(Direction[1]);//打印 Up
console.log(Direction[2]);//打印 Left
console.log(Direction['Up']);//打印 1
console.log(Direction.Down);//打印 2
console.log(Direction.Left);//打印 2
console.log(Direction.Right);//打印 3

console.log('*******************************');

// 示例2：枚举成员使用 常数枚举表达式 初始化
/* 
满足下面条件之一时，它就是一个常数枚举表达式：
1. 数字字面量
2. 引用之前定义的常数枚举成员（可以是在不同的枚举类型中定义的，
如果这个成员是在同一个枚举类型中定义的，可以直接引用。）
3. 带括号的常数枚举表达式
4. +, -, ~ 一元运算符应用于常数枚举表达式
5. +, -, *, /, %, <<, >>, >>>, &, |, ^ 二元运算符，
常数枚举表达式做为其一个操作对象。
（若常数枚举表达式求值后为NaN或Infinity，则会在编译阶段报错。）
*/
enum FileAccess {
  // 常数枚举成员
  None = 0, //数字字面量
  Read = 1 << 1,  //含有二元运算符，运算结果：2
  Write = 1 << 2,  //含有二元运算符，运算结果：4
  RWD = Read | Write | Direction.Up, //引用之前定义的常数枚举成员
  A = (1 + 1) * 4,  //带括号的常数枚举表达式
  B = ~5,  //含有一元运算符，运算结果：-6

  // 计算枚举成员
  G = "123".length
}
console.log(FileAccess.None); //打印 0
console.log(FileAccess.Read); //打印 2
console.log(FileAccess.Write); //打印 4
console.log(FileAccess.RWD); //打印 7
console.log(FileAccess.A); //打印 8
console.log(FileAccess.B); //打印 -6
console.log(FileAccess.G); //打印 3

// ts 运算符表：https://www.runoob.com/typescript/ts-operators.html

// const enum Directions {
//   Up,
//   Down,
//   Left,
//   Right
// }

// let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]